分组 (GROUP BY)

1. 概述

在 SQL 中,GROUP BY 子句用于将数据按照一个或多个列进行分组,通常与聚合函数(如 SUM, AVG, COUNT, MAX, MIN)一起使用,以便对每个组进行汇总计算。GROUP BY 是数据分析和报表生成中的重要工具。

2. 理论解释

2.1 基本概念

  • 分组:将数据按照指定的列进行分组,每个组内的数据具有相同的列值。
  • 聚合函数:对每个组进行计算的函数,如 SUM(求和)、AVG(平均值)、COUNT(计数)、MAX(最大值)、MIN(最小值)。

2.2 语法结构

SELECT 列1, 列2, ..., 聚合函数(列)
FROM 表名
WHERE 条件
GROUP BY 列1, 列2, ...;
  • SELECT:选择需要显示的列和聚合函数。
  • FROM:指定数据来源的表。
  • WHERE:过滤数据的条件。
  • GROUP BY:指定分组的列。

3. 代码示例

3.1 示例表结构

假设我们有一个名为 orders 的表,结构如下:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    amount DECIMAL(10, 2)
);

3.2 插入示例数据

INSERT INTO orders (order_id, customer_id, order_date, amount) VALUES
(1, 101, '2023-01-01', 100.00),
(2, 102, '2023-01-02', 150.00),
(3, 101, '2023-01-03', 200.00),
(4, 103, '2023-01-04', 50.00),
(5, 102, '2023-01-05', 300.00);

3.3 基本分组查询

查询每个客户的订单总金额:

SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id;

输出结果:

| customer_id | total_amount | |-------------|--------------| | 101 | 300.00 | | 102 | 450.00 | | 103 | 50.00 |

3.4 使用多个列进行分组

查询每个客户在每个月的订单总金额:

SELECT customer_id, DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id, DATE_FORMAT(order_date, '%Y-%m');

输出结果:

| customer_id | month | total_amount | |-------------|---------|--------------| | 101 | 2023-01 | 300.00 | | 102 | 2023-01 | 450.00 | | 103 | 2023-01 | 50.00 |

4. 实践练习

4.1 练习1:计算每个客户的订单数量

编写一个 SQL 查询,计算每个客户的订单数量。

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;

4.2 练习2:计算每个月的总订单金额

编写一个 SQL 查询,计算每个月的总订单金额。

SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(amount) AS total_amount
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m');

5. 总结

GROUP BY 是 SQL 中非常重要的一个子句,它允许我们按照指定的列对数据进行分组,并使用聚合函数对每个组进行汇总计算。通过本教程的学习,你应该能够理解 GROUP BY 的基本概念和使用方法,并能够在实际项目中应用它。

6. 进阶学习

在掌握了 GROUP BY 的基本用法后,你可以进一步学习 HAVING 子句、子查询、表连接等高级 SQL 技术,以便更灵活地处理和分析数据。